home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / select / select.c < prev    next >
Text File  |  1995-02-18  |  8KB  |  347 lines

  1. /*
  2.   r.m=80 tab=4
  3.     =======================================================================
  4.    ==  <<バッチ分岐支援プログラム>>                                       ==
  5.    ==      [ select.exe ]      Ver 0.10                                   ==
  6.    ==                                     1995      Program : Y.Gotoh     ==
  7.     =======================================================================
  8. */
  9.  
  10. /*外部ファイル読み込み */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <conio.h>
  16. #include <ctype.h>
  17. #include <gds.h>
  18. #include "gotoh.h"
  19.  
  20. /* グローバル変数の設定 */
  21.  
  22. int center=1;        /* 選択肢の表示位置。初期(1)は中央 */
  23. int end_echo=0;        /* エンディングエコーの表示非表示。初期(0)は非表示 */
  24. int g_clear=0;        /* 実行後のグラフィックのクリア。初期(0)はしない。 */
  25. int under_bar=1;    /* アンダーバー変換。初期(1)はする。*/
  26. int sel_color=3;    /* 選択肢の色、初期(3)は黄色 */
  27.  
  28. char *sel[20];        /* select群で使用 */
  29. char *help={        /* ヘルプメッセージ */
  30.     "\n"
  31.     "             \"select.exe\"  Ver 0.10      1995 : Y.Gotoh (Gori)\n"
  32.     "\n"
  33.     "  select.exe [option] title sel_1 sel_b sel_c ・・・\n"
  34.     "  /b[r][g][b]  ・・・ Back color       [r],[g],[b]で背景を塗ります.\n"
  35.     "  /c[n]        ・・・ selector Color   カーソルの色を[n]に変更します.\n"
  36.     "  /e           ・・・ Eending echo     終了時メッセージを表示します.\n"
  37.     "  /g           ・・・ Graphic clear    グラフィックを消去します.\n"
  38.     "  /h , /?      ・・・ Help             ヘルプを表示します.\n"
  39.     "  /l           ・・・ at the Left      選択肢を左寄せにします.\n"
  40.     "  /_           ・・・ not change '_'   アンダーバーを変換しません.\n"
  41.     "\n"
  42.     "  ==メニューの使い方==\n"
  43.     "      [↑],[F],[E]   ・・・・・・・・・・  カーソルを上へ移動\n"
  44.     "      [↓],[J],[X]   ・・・・・・・・・・       〃   下  〃  \n"
  45.     "     [ret],[space]   ・・・・・・・・・・  決定\n"
  46.     "         [0~9]      ・・・・・・・・・・  その番号のメニューを実行\n"
  47.     "     [esc],[Q],[q]   ・・・・・・・・・・  終了\n\n"
  48.     };
  49.  
  50.  
  51. /* 関数の定義 */
  52.  
  53. /* 雑用関数 */
  54.  
  55. void waitkey( int wait_time);
  56. void HELP( void );
  57. void center_puts( int y , char *msg);
  58.  
  59. /* セレクト群関数 */
  60.  
  61. int select(int sel_max);
  62. void select_list(int sel_max);
  63. void select_prt(int sel_no,int sel_bak);
  64. void select_cprt(int num);
  65.  
  66. /* メイン */
  67.  
  68. int main(int argc , char *argv[])
  69. {
  70.     /* 初期設定 */
  71.     int ret,sel_max=-1,i,j;            /* sel_maxは後の所で修正されるため初期値 */
  72.                                                             /* は(-1)とする */
  73.     int pal[3]={0,0,0};                                        /* 背景パレット */
  74.     char dmy;                                                    /* 雑用char*/
  75.     
  76.     /* 画面消去・設定 */
  77.     
  78.     txt_cls();
  79.     txt_csl(0);                                            /* カーソル表示off */
  80.     GDS_write_page(1);                                    /* page1を使用 */
  81.     GDS_display_page(1);
  82.     if(g_clear)
  83.     {
  84.         GDS_all_clear();
  85.     }
  86.     
  87.     /* パラメータの読み込み */
  88.     
  89.     if(argc<2)    HELP();                        /* パラメータ無しはヘルプ表示 */
  90.     
  91.     for(i=1;i<argc;i++)
  92.     {
  93.         if(*(argv[i])=='/' || *(argv[i])=='-')    /* '/','-'のどちらにも対応 */
  94.         {
  95.             tolower( *(argv[i]+1) );
  96.             
  97.             switch(*(argv[i]+1))
  98.             {
  99.                 case 'b':
  100.                     strlwr(argv[i]);
  101.                     for(j=2;j<strlen(argv[i]);j++)
  102.                     {
  103.                         dmy=*(argv[i]+j);
  104.                         
  105.                         if(dmy>=0x61 && dmy<=0x66)        /* a~fは10~15へ */
  106.                         {
  107.                             pal[j-2]=(9+(dmy-0x60))*16;
  108.                         }
  109.                         else    pal[j-2]=(atoi(&dmy))*16;
  110.                     }
  111.                     GDS_palette(0,pal[0],pal[1],pal[2]);
  112.                 break;
  113.                 
  114.                 case 'c':
  115.                     dmy=*(argv[i]+2);
  116.                     if(dmy>=0x30 && dmy<=0x37)
  117.                     {
  118.                         sel_color=atoi(&dmy);
  119.                     }
  120.                     else    sel_color=3;
  121.                 break;
  122.                 
  123.                 case 'e':                        /* 終了メッセージを表示する */
  124.                     end_echo=1;
  125.                 break;
  126.                 
  127.                 case 'g':                            /* G画面の消去をする */
  128.                     g_clear=1;
  129.                 break;
  130.                 
  131.                 case 'h':                                        /* ヘルプ */
  132.                 case '?':
  133.                     HELP();
  134.                 break;
  135.                 
  136.                 case 'l':
  137.                     center=0;                            /* 選択肢を左寄せ */
  138.                 break;
  139.                 
  140.                 case '_':                        /* アンダーバー変換をしない */
  141.                     under_bar=0;
  142.                 break;
  143.                 
  144.                 default:
  145.                     printf("オプション[%c]には未対応.\n",*(argv[i]+1));
  146.                     waitkey(10);
  147.             }
  148.         }
  149.         else
  150.         {
  151.             sel_max++;
  152.             sel[sel_max]=argv[i];
  153.         }
  154.     }
  155.     
  156.     if(sel_max<2)
  157.     {
  158.         txt_color(1);                                                /* 赤 */
  159.         printf("\nerror!! 選択肢の数が足りません!!\n");
  160.         txt_color(7);                                                /* 白 */
  161.         HELP();
  162.     }
  163.     
  164.     if(under_bar)                            /* under_barが0なら処理をしない */
  165.     {
  166.         for(i=0;i<=sel_max;i++)
  167.         {
  168.             for(j=0;j<strlen(sel[i]);j++)                /* アンダーバーをス */
  169.             {                                            /* ペースに変換する。 */
  170.                 if( *(sel[i]+j)=='_' )
  171.                 {
  172.                     *(sel[i]+j)=' ';
  173.                 }
  174.             }
  175.         }
  176.     }
  177.     
  178.     /* タイトル */
  179.     locate(20,1);
  180.         txt_color(3);
  181.         printf(    "------------------------------------------\n");
  182.     locate(20,2);
  183.         printf(    " [select,exe]     1995 program : Y.Gotoh \n");
  184.     locate(20,3);
  185.         printf(    "------------------------------------------\n");
  186.     txt_color(7);
  187.     
  188.     /* メイン */
  189.     
  190.     ret=select(sel_max);                                /* 選択ルーチンへ */
  191.     if(ret==-1)    ret=0;                    /* エスケープ終了は通常終了にする */
  192.     
  193.     /* 終了処理 */
  194.     
  195.     txt_cls();
  196.     if(end_echo)                    /* end_echo が 0 以外ならメッセージ表示 */
  197.     {
  198.         printf(    "[select.exe] Ver 0.10  program : Y.Gotoh\n"
  199.                 "    returned error level [%d]\n",ret);
  200.     }
  201.     txt_csl(1);                                            /* カーソルの表示 */
  202.     if(g_clear)    GDS_palette(0,0,0,0);        /* g_clearが0以外なら画面消去 */
  203.     exit(ret);
  204. }
  205.  
  206. /* ヘルプを表示するサブ */
  207. void HELP(void)
  208. {
  209.     printf("%s",help);
  210.     exit(0);
  211. }
  212.  
  213. /* select : 項目選択用サブ ,*sel[] をグローバルで用意すること */
  214. int select(int sel_max)
  215. {
  216.     int sel_no=1,sel_bak=1,ret=0;
  217.     char key='\0';                            /* とりあえずループさせるために */
  218.     
  219.     center_puts(5,sel[0]);                                    /* タイトル表示 */
  220.     
  221.     select_list(sel_max);                                        /* 一覧表示 */
  222.     select_prt(sel_no,sel_bak);            /* 初期位置(1)にカーソルを持ってくる */
  223.     
  224.     do
  225.     {
  226.         key=getch();
  227.         key=tolower(key);
  228.         
  229.         /* [↑,F,E]の時 */
  230.         if(key=='\x1e' || key=='\x66' || key=='\x65')
  231.         {
  232.             sel_bak=sel_no;
  233.             sel_no--;
  234.             if(sel_no<1) sel_no=sel_max;
  235.             select_prt(sel_no,sel_bak);
  236.         }
  237.         
  238.         /* [↓,J,X]の時 */
  239.         if(key == '\x1f' || key=='\x6a' || key=='\x78')
  240.         {
  241.             sel_bak=sel_no;
  242.             sel_no++;
  243.             if(sel_no>sel_max) sel_no=1;
  244.             select_prt(sel_no,sel_bak);
  245.         }
  246.         
  247.         /* 各数字(0~9)が押された時 */
  248.         if(key >= '\x30' && key <= '\x39')
  249.         {
  250.             sel_bak=sel_no;
  251.             sel_no=(int)key-0x30;
  252.             if(sel_no==0) sel_no=10;
  253.             if(sel_no>sel_max)
  254.             {
  255.                 sel_no=sel_bak;
  256.             }
  257.             else
  258.             {
  259.                 select_prt(sel_no,sel_bak);
  260.                 waitkey(20);
  261.                 key='\x0d';
  262.             }
  263.         }
  264.     }while(key != '\x0d' && key != '\x1b' && key != '\x20' && key != '\x71');
  265.     
  266.     if(key == '\x0d' || key == '\x20' )    ret=sel_no;    /* [space],[ret]なら
  267.                                                             選択番号を返す */
  268.     if(key == '\x71')    ret=0;                    /* [Q],[q]なら終了(ret=0) */
  269.     if(key == '\x1b')    ret=-1;                        /* [esc]なら-1を返す */
  270.     
  271.     return(ret);
  272. }
  273.  
  274. /* 選択肢一覧表示 */
  275. void select_list(int sel_max)
  276. {
  277.     int i;
  278.     
  279.     for(i=1;i<=sel_max;i++)
  280.     {
  281.         if(center)
  282.         {
  283.             select_cprt(i);
  284.         }
  285.         else
  286.         {
  287.             locate(18,i+6);
  288.             printf("%2d: %s",i,sel[i]);
  289.         }
  290.     }
  291. }
  292.  
  293. /* 選択カーソル表示ルーチン */
  294. void select_prt(int sel_no,int sel_bak)
  295. {
  296.     if(center)
  297.     {
  298.         select_cprt(sel_bak);
  299.         
  300.         printf("\x1b[7;%dm",sel_color+30);        /* テキスト属性をリバースに */
  301.         select_cprt(sel_no);
  302.         printf("\x1b[0;37m");                                    /* 元に戻す */
  303.     }
  304.     else
  305.     {
  306.         /* 帯を消す */
  307.         locate(18,sel_bak+6);
  308.         printf("%2d: %s",sel_bak,sel[sel_bak]);
  309.         
  310.         /* 新しく帯を引く */
  311.         locate(18,sel_no+6);
  312.         printf("\x1b[7;%dm%2d: %s\x1b[0;37m",sel_color+30,sel_no,sel[sel_no]);
  313.     }
  314. }
  315.  
  316. void select_cprt(int num)
  317. {
  318.     locate(18,num+6);                            /* 数字のみは左寄せで表示 */
  319.     printf("%2d:",num);
  320.     
  321.     center_puts(num+6,sel[num]);
  322. }
  323.  
  324. /* サブルーチン */
  325.  
  326. /* 文字列を中央に表示するサブ */
  327. void center_puts(int y,char *msg)
  328. {
  329.     int x=40-(strlen(msg)/2);
  330.     
  331.     locate(x,y);
  332.     printf("%s",msg);        /* 本来はputsを使用するが、このプログラムでそれを */
  333.                             /* するとファイルサイズの増加につながるために、pr */
  334.                             /* intfを使用 */
  335. }
  336.  
  337. /* 何かキーを押すか一定時間経つと処理を復帰するサブ */
  338. void waitkey(int wait_time)
  339. {
  340.     int i=0;
  341.     
  342.     for(i=0;i<wait_time*10;i++)
  343.     {
  344.         if( kbhit() != 0)    break;
  345.     }
  346. }
  347.